package com.parent.utils;

import org.apache.poi.ss.formula.functions.T;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author yan
 * @Date 2023/5/9 0009 16:13
 * @Description
 */
public class ListUilts {

    /**
     * 将一个列表分成若干个指定大小的子列表
     *
     * @param list      待拆分的列表
     * @param batchSize 每个子列表的最大长度
     * @return 以指定长度拆分后的子列表集合
     */
    public static <T> List<List<T>> subListsByFori(List<T> list, int batchSize) {
        // 初始化一个空的子列表集合
        List<List<T>> subLists = new ArrayList<>();
        // 获取原始列表的总长度
        int totalCount = list.size();
        // 计算出需要拆分成多少个子列表
        int batchCount = (totalCount + batchSize - 1) / batchSize;
        // 循环遍历，拆分成多个子列表
        for (int i = 0; i < batchCount; i++) {
            // 计算当前子列表的起始索引和结束索引
            int fromIndex = i * batchSize;
            int toIndex = Math.min((i + 1) * batchSize, totalCount);
            // 将当前子列表添加到子列表集合中
            subLists.add(list.subList(fromIndex, toIndex));
        }
        // 返回拆分后的子列表集合
        return subLists;
    }

    /**
     * 将一个列表分成若干个指定大小的子列表
     *
     * @param list      待拆分的列表
     * @param batchSize 每个子列表的最大长度
     * @return 以指定长度拆分后的子列表集合
     */
    public static <T> List<List<T>> subListsByStream(List<T> list, int batchSize) {
        // 将原始列表转换为一个流
        Stream<T> stream = list.stream();
        // 将流按照指定大小拆分成多个子流，并将每个子流转换为一个子列表
        return stream.collect(Collectors.groupingBy(it -> (list.indexOf(it) / batchSize)))
                .entrySet().stream()
                .sorted(Map.Entry.comparingByKey())
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());
    }

    /**
     *
     * @param list
     * @return
     * @param <T>
     */
    public static <T> boolean isNull(List<T> list) {
        return (list == null && list.size() <= 0);
    }

    /**
     *
     * @param list
     * @return
     */
    public static boolean isNotNull(List<T> list) {
        return !isNull(list);
    }
}
